#include "octane-oslintrin.h"
float sdSphere(vector p)
{    
    return sqrt(p[0]*p[0] + p[1]*p[1] + p[2]*p[2]) - 1.0;
}

float sdBox(vector p, vector b)
{
  vector d = abs(p) - b;
  return min(max(d[0],max(d[1],d[2])),0.0) + length(max(d,0.0));
}

float displace()
{
    return 0.001*length(P);
}

float smax(float a,  float b, float k)
{
    return log(exp(k*a) + exp(k*b)) / k;
}

float smin( float a, float b, float k )
{
    float res = exp( -k*a ) + exp( -k*b );
    return -log( res )/k;
}

float map(vector p, vector spherePos, float k)
{
   float d = sdBox(p,vector(1.0));

   float s = 1.0;
   for( int m=0; m<8; m++ )
   {
      vector a = mod( p*s, 2.0 )-1.0;
      s *= 3.0;
      vector r = abs(1.0 - 3.0*abs(a));

      float da = max(r[0],r[1]);
      float db = max(r[1],r[2]);
      float dc = max(r[2],r[0]);
      float c = (smin(da,smin(db,dc, k), k)-1.0)/s;

      d = max(d,c);
   }

   d = max(d, -sdSphere(P - spherePos));

   return d;
}



shader Menger(
    vector spherePos = vector(1,1,1),
    vector pos = vector(0,0,0),
    float  scale = 1,
    color  tex = 0,
    float  texscale = 1,
    float  k = 1,
    output _sdf c = _SDFDEF)
{

    //c = smin(sdBox(P, vector(1,1,1)),
    //         sdBox(P + vector(1,1,1), vector(1,1,1)), 
    //         k) ;//map(P+tex*scale, spherePos);

    c.dist = map(P, spherePos, k);
}
